package cn.me.alphamq.common.model.broker;

import java.util.HashMap;
import java.util.Map;

/**
 * ConsumeQueue 的 offset 的模型
 *
 * @author f
 */
public class ConsumeQueueOffsetModel {

    /**
     * 管理消费 offset 的表
     * 第一层：key：topic 名称；value：消费者组表 consumerGroupMap
     * 第二层：key：消费组名称；value：消费队列表 consumeQueueMap
     * 第三层：key：队列 id；value：消费详情 consumeDetail（组成为 "CommitLog文件名#消费offset"）
     */
    private Map<String, Map<String, Map<String, String>>> offsetTable = new HashMap<>();

    /**
     * 强制根据 topic 名称获取 消费者组表，如果没有，就新建一个 消费者组表 放到 offset 表中，并映射
     *
     * @param topicName topic 名称
     * @return
     */
    public Map<String, Map<String, String>> fetchConsumerGroupMapForcibly(String topicName) {
        return offsetTable.computeIfAbsent(topicName, k -> new HashMap<>());
    }

    /**
     * 根据 topic 名称 和 消费组名称 获取 消费队列表
     *
     * @param topicName topic 名称
     * @param groupName 消费者名称
     * @return
     */
    public Map<String, String> fetchConsumeQueueMap(String topicName, String groupName) {
        return offsetTable.get(topicName).get(groupName);
    }

    /**
     * 根据 topic 名称、消费组名称 和 队列 id 获取 消费详情
     *
     * @param topicName topic 名称
     * @param groupName 消费者名称
     * @param queueId   队列 id
     * @return
     */
    public String fetchConsumeDetail(String topicName, String groupName, Integer queueId) {
        return offsetTable.get(topicName).get(groupName).get(queueId);
    }

    public Map<String, Map<String, Map<String, String>>> getOffsetTable() {
        return offsetTable;
    }

    public void setOffsetTable(Map<String, Map<String, Map<String, String>>> offsetTable) {
        this.offsetTable = offsetTable;
    }

}
